/**
 * 当一个方法不被这个类支持，但仍被调用时，会抛出此异常。
 *
 * @version 1.0
 * @exception
 */
import IllegalArgumentException from "./IllegalArgumentException";

export default class UnsupportedOperationException extends Error{

  /**
   * 当一个方法不被支持但仍被调用时，会抛出此异常。
   *
   * @param clazz 调用是该方法所在的类（如果该方法不依赖任何类，请传入undefined）
   * @param fs 调用的方法（可以有多个）
   *
   * @throws {IllegalArgumentException} 当传入的fs中没有任何方法时，会引发参数异常错误
   */
  public constructor(clazz?: Function, ...fs: Function[]) {
    if (fs.length === 0) {
      throw new IllegalArgumentException("You must support at least one function or class");
    }
    if (clazz === undefined) {
      if (fs.length === 1) {
        super("function " + fs[0].name + " is not supported");
      } else {
        super("functions " + fs.map(func => func.name).join(", ") + " are not supported");
      }
    } else {
      if (fs.length === 1) {
        super("function " + fs[0].name + " in class " + clazz.name + " is not supported");
      } else {
        super("functions " + fs.map(func => func.name).join(", ") + " in class " + clazz.name + " are not supported");
      }
    }
  }
}
